Streamlit in Snowflake が AWS PrivateLink に対応したので試してみた #SnowflakeDB
はじめに
2024年10月のアップデートで Streamlit in Snowflake の AWS PrivateLink のサポートがパブリックプレビューとなりました。 こちらの機能を試してみましたので本記事で内容をまとめます。
Streamlit in Snowflake と AWS PrivateLink
Snowflake では Streamlit in Snowflake として Snowflake の GUI 画面である Snowsight 上で Streamlit のアプリ開発と実行が可能です。
また Snowflake は各クラウドサービスのプライベート接続に対応しており、AWS であれば PrivateLink を使用できます。これにより、ユーザーは自身の管理する VPC と Snowflake アカウント間をパブリックなインターネットを介さずに接続できます。
これまでは Streamlit in Snowflake で Privatelink がサポートされていなかったため、Privatelink 経由で Snowsight 上でアプリの実行や開発を行うことができませんでしたが、今回のアップデートでこれに対応できるようになります。
前提条件
以下の構成で検証を行いました。
- Snowflake
- Business Ciritical
- PrivateLink の設定には Business Ciritical 以上のエディションが必要
- クラウドリージョン:AWS_AP_NORTHEAST_1
- Business Ciritical
- AWS
- Snowflake アカウントと同一のリージョンに VPC を作成
事前準備
Snowflake アカウントとの PrivateLink 設定
Streamlit in Snowflake 用のプライベート接続設定のためには、前提として Snowflake アカウントに対して AWS PrivateLink 設定を行っておく必要があります。ここでは内部ステージへのアクセス方法としてゲートウェイ型のエンドポイントを使用する構成で検証を行いました。
設定後、対象の VPC から Snowsight にプライベート接続用の URL でアクセスできるか確認しておきます。
Snowflake アカウントの AWS PrivateLink 設定手順は以下をご参照ください。
Streamlit アプリの作成
以下のコマンドでサンプルの Streamlit アプリの作成先となるデータベース、アプリ作成用のロールを用意しておきました。
--データベースを作成
USE ROLE SYSADMIN;
CREATE DATABASE st_database;
--roleの作成
USE ROLE USERADMIN;
CREATE ROLE streamlit_creator;
--権限の付与
USE ROLE SECURITYADMIN;
----ロール階層
GRANT ROLE streamlit_creator TO ROLE SYSADMIN;
----ウェアハウス
GRANT USAGE ON WAREHOUSE compute_wh TO ROLE streamlit_creator;
----streamlit権限
GRANT USAGE ON SCHEMA st_database.public TO ROLE streamlit_creator;
GRANT USAGE ON DATABASE st_database TO ROLE streamlit_creator;
GRANT CREATE STREAMLIT ON SCHEMA st_database.public TO ROLE streamlit_creator;
GRANT CREATE STAGE ON SCHEMA st_database.public TO ROLE streamlit_creator;
GUI からアプリを作成
アプリの中身はデフォルトで用意されているサンプルコードのままとしました。
Streamlit in Snowflake へのプライベート接続設定を行う
Streamlit in Snowflake のプライベート接続の構成手順は以下に記載があります。
構成前の状態
事前準備後、Snowsight にプライベート接続します。この時点で Streamlit アプリを開こうとしても下図のようにエラーとなります。
新規のアプリを構築しようとした場合、アプリ自体(オブジェクト)は作成されますが、表示はできない状態でした。
オブジェクトは作成されます。
DNS 設定
Snowflake 側でSYSTEM$GET_PRIVATELINK_CONFIG を実行します。
USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$GET_PRIVATELINK_CONFIG();
出力は以下のようになっており、Snowflake へのプライベート接続用の URL などの情報を返してくれます。
{
"privatelink-account-principal":"arn:aws:iam::xxxxxxxxxxxx:root",
"regionless-snowsight-privatelink-url":"app-<organization>-<account>.privatelink.snowflakecomputing.com",
"privatelink-account-name":"<アカウント識別子>.ap-northeast-1.privatelink",
"privatelink-vpce-id":"com.amazonaws.vpce.ap-northeast-1.vpce-svc-xxxxx",
"snowsight-privatelink-url":"app.ap-northeast-1.privatelink.snowflakecomputing.com",
"regionless-privatelink-ocsp-url":"ocsp.<組織名>-<アカウント名>.privatelink.snowflakecomputing.com",
"privatelink-account-url":"<アカウント識別子>.ap-northeast-1.privatelink.snowflakecomputing.com",
"app-service-privatelink-url":"*.xxxxx.privatelink.snowflake.app",
"regionless-privatelink-account-url":"<組織名>-<アカウント名>.privatelink.snowflakecomputing.com",
"privatelink_ocsp-url":"ocsp.<アカウント識別子>.ap-northeast-1.privatelink.snowflakecomputing.com"
}
Streamlit in Snowflake のプライベート接続構成には、このうちapp-service-privatelink-url
を使用します。この値が Streamlit アプリケーションへのトラフィックを AWS PrivateLink 経由でルーティングするために必要なワイルドカード URL として使用されるようです。
*.xxxxx.privatelink.snowflake.app
VPC 内から上記の URL に名前解決するためにここでは以下の設定を AWS 側で行いました。
- privatelink.snowflake.app のプライベートホストゾーンを作成
- CNAME レコードとして
*.xxxxx.privatelink.snowflake.app
を追加- 値は事前準備で Snowflake アカウントへのプライベート接続用に作成した既存の VPC エンドポイントの DNS 名
レコード追加後、Snowsight から Streamlit アプリを開くと下図のようにアプリが表示されました。
この際、ブラウザ上の URL は https://app.ap-northeast-1.privatelink.snowflakecomputing.com///#/streamlit-apps
からなる URL が表示されました。
ドキュメントの引用を日本語訳したものですが、以下のように記載があり、内部的に Streamlit 固有の URL にリダイレクトされるようです。
Snowflake の Streamlit は、特定のセキュリティ要件に合わせて別の URL スキームを使用します。Streamlit URL には独自のトップレベル ドメインがあり、Snowsight と共有される要素はありません。各 Streamlit アプリには固有のオリジンがあります。
試しに簡単にコードを変更してみたりしましたが、変更内容の反映を確認しつつ、通常の URL からも変更された内容を確認できました。
アプリの共有
プライベート接続時にアプリの共有を行うと共有リンクとしてもプライベート接続用の URL が使用されます。
さいごに
Streamlit in Snowflake の AWS PrivateLink 設定を試してみました。Streamlit in Snowflake のアプリをプライベート接続経由で表示するには既存の構成に加えて追加の設定が必要となるためご注意ください。こちらの内容が何かの参考になれば幸いです。